/**
 *  @author Chen Mingjian  creat on 2012-3-26
 *
 */
package corejava.corejava1.ch05.p01;

import java.util.*;

/**
 * 使用多态和抽象类 This program demonstrates abstract classes.
 * 
 * @version 1.01 2004-02-21
 * @author Cay Horstmann
 */
public class Ch5_01_PersonTest {
    public static void main(String[] args) {
        Person[] people = new Person[2];

        // fill the people array with Student and Employee objects
        people[0] = new Employee("Harry Hacker", 50000., 1989, 10, 1);
        // Employee 是一个Person，所以它可以赋值给Person的变量

        people[1] = new Student("Maria Morris", "computer science");
        // 同上

        // print out names and descriptions of all Person objects
        for (Person p : people) {
            System.out.println(p.getName() + ", " + p.getDescription());
            // 调用getDescription是子类的方法
        }
    }
}

abstract class Person {
    public Person(String n) {
        name = n;
    }

    public abstract String getDescription();

    public String getName() {
        return name;
    }

    private String name;
}

class Employee extends Person {
    public Employee(String n, double s, int year, int month, int day) {
        super(n);
        salary = s;
        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
        hireDay = calendar.getTime();
    }

    public double getSalary() {
        return salary;
    }

    public Date getHireDay() {
        return hireDay;
    }

    public String getDescription() {
        return "an employee with a salary of $ " + salary;
    }

    public void raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
    }

    private double salary;
    private Date   hireDay;
}

class Student extends Person {
    /**
     * @param n
     *            the student's name
     * @param m
     *            the student's major
     */
    public Student(String n, String m) {
        // pass n to superclass constructor
        super(n);
        major = m;
    }

    public String getDescription() {
        return "a student majoring in " + major;
    }

    private String major;
}
